#ifndef DATA_PROCESS_DATA_H
#define DATA_PROCESS_DATA_H

#include <numeric>
#include <random>
#include <iostream>

#define DPR_ERR(x) (-x)  // -1~-1000
#define E_DPR_NO_ERROR                  0              // 没有错误
#define E_DPR_GEN_RAND_INVALID_PARA     DPR_ERR(1)     // 生成随机数输入不合法

/**
 * @brief 根据上下限生成N组随机数
 * @param N: 数据行数
 * @param upper_limit: 上限
 * @param lower_limit: 下限
 * @return 维度为N*M的随机数矩阵
 */
template <typename T1, typename T2>
int GenerateRandomMatrix(const T2& upper_limit, const T2& lower_limit, T1& result)
{
    unsigned int N = result.size();
    //! 需要先声明result的长度，若未声明，则判定为输入非法
    if(N == 0 || result[0].size() == 0)
    {
        ROS_ERROR("生成随机数失败, 请先声明result的长度, 再调用该函数!");
        return E_DPR_GEN_RAND_INVALID_PARA;
    }
    unsigned int M = upper_limit.size();
    //! 检查上下限输入维度是否合法
    if(M != lower_limit.size() || M != result[0].size())
    {
        ROS_ERROR("生成随机数失败, 上下限维度不相等!");
        return E_DPR_GEN_RAND_INVALID_PARA;
    }
    //! 检查上下限输入数据是否合法
    for(unsigned int i = 0; i < M; i++)
    {
        if(upper_limit[i] <= lower_limit[i])
        {
            ROS_ERROR("生成随机数失败, 上下限输入不合法，上限小于下限!");
            return E_DPR_GEN_RAND_INVALID_PARA;
        }
    }

    std::default_random_engine generator;
    for (unsigned int i = 0; i < N; i++)
    {
        for (unsigned int j = 0; j < M; j++)
        {
            std::uniform_real_distribution<double> distribution(upper_limit[j], lower_limit[j]);
            result[i][j] = distribution(generator);
        }
    }

    return E_DPR_NO_ERROR;
}

#endif // DATA_PROCESS_DATA_H